package com.huiyeji.hui.service;

import com.huiyeji.hui.entity.User;
import com.huiyeji.hui.entity.UserInfoEntity;
import com.huiyeji.hui.utils.HuiResponse;
import com.huiyeji.hui.vo.*;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

/**
 * @author zhaoduo
 */
public interface ApplicationService {

    /**
     * 得到用户信息
     * @param userInfo userInfo
     * @return User
     */
    User getUserInfo(UserInfoEntity userInfo);

    /**
     * 注册
     * @param userInfo userInfo
     */
    void register(UserInfoEntity userInfo);

    /**
     * 得到oss policy
     * @return map
     */
    Map<String, String> getPolicy();

    /**
     * 修改用户基本信息
     * @param requestUser 用户请求修改信息
     * @param user 用户源信息
     * @return HuiResponse
     * @throws CloneNotSupportedException bean克隆异常
     */
    HuiResponse<?> userBaseModify(User requestUser, User user) throws CloneNotSupportedException;

    /**
     * 修改用户密码
     * @param user 源用户
     * @param vo 用户修改密码请求vo
     */
    void changeUserPwd(User user, PwdChangeVo vo);

    /**
     * 得到用户,用户好友以及公共群成员,用户所有群聊信息
     * @param user 源用户
     * @return SelfAndOthersAndGroupsVo
     * @throws CloneNotSupportedException bean克隆异常
     * @throws ExecutionException 线程池异常
     * @throws InterruptedException 线程阻断异常
     */
    SelfAndOthersAndGroupsVo getSelfAndOthersAndGroups(User user) throws CloneNotSupportedException, ExecutionException, InterruptedException;

    /**
     * 得到用户基本信息(安全)
     * @param user 源用户
     * @return 用户信息(安全)
     * @throws CloneNotSupportedException bean克隆异常
     */
    User getUserInfoSafely(User user) throws CloneNotSupportedException;

    /**
     * 更改源用户头像
     * @param user uid
     * @param headshot 头像url
     */
    void changeHeadshot(User user, String headshot);

    /**
     * 更改群聊名称
     * @param uid uid
     * @param gid gid
     * @param groupName 新群名称
     */
    void changeGroupName(Long uid, Long gid, String groupName);

    /**
     * 更改群公告
     * @param uid uid
     * @param gid gid
     * @param notice 新公告
     */
    void changeGroupNotice(Long uid, Long gid, String notice);

    /**
     * 根据key搜索群聊(不包括源用户创建和加入的群聊)
     * @param uid 源用户id
     * @param params 搜索条件)
     * @return PageResult
     */
    PageResult<SimpleGroupVo> groupKeySearch(Long uid, Map<String, String> params);

    /**
     * 根据condition查询群聊(不包括源用户创建和加入的群聊)
     * @param uid 源用户id
     * @param params 搜索条件
     * @return PageResult
     */
    PageResult<SimpleGroupVo> groupConditionSearch(Long uid, Map<String, String> params);

    /**
     * 根据key搜索用户(不包括源用户的好友)
     * @param uid 源用户id
     * @param params 搜索条件)
     * @return PageResult
     */
    PageResult<SimpleOtherVo> userKeySearch(Long uid, Map<String, String> params);

    /**
     * 根据condition查询用户(不包括源用户的好友)
     * @param uid 源用户id
     * @param params 搜索条件
     * @return PageResult
     */
    PageResult<SimpleOtherVo> userConditionSearch(Long uid, Map<String, String> params);

    /**
     * 解散群聊
     * @param uid 源用户id
     * @param gid 群聊id
     */
    void removeGroup(Long uid, Long gid);

    /**
     * 创建群聊
     * @param uid 源用户id
     * @param groupName 群名称
     */
    void createGroup(Long uid, String groupName);

    /**
     * 删除好友
     * @param uid 源用户id
     * @param fid 要删除的好友id
     */
    void userDeleteFriend(Long uid, Long fid);

    /**
     * 特别关心某位好友
     * @param uid 源用户id
     * @param fid 目标好友id
     */
    void userCareFriend(Long uid, Long fid);

    /**
     * 拉黑某位好友
     * @param uid 源用户id
     * @param fid 目标好友id
     */
    void putFriendIntoBlackList(Long uid, Long fid);

    /**
     * 更改某位好友备注
     * @param uid 源用户id
     * @param oid 目标好友id
     * @param remark 新备注
     */
    void userChangeRemark(Long uid, Long oid, String remark);

    /**
     * 退群
     * @param uid 源用户id
     * @param gid 目标群聊id
     */
    void userExitGroup(Long uid, Long gid);

    /**
     * 将某用户踢出某群聊
     * @param uid 源用户id
     * @param gid 目标群聊id
     * @param oid 目标用户id
     */
    void kickOutOtherFromGroup(Long uid, Long gid, Long oid);

    /**
     * 恢复正常好友关系
     * @param uid 源用户id
     * @param oid 目标好友id
     */
    void userRelationRecoverNormal(Long uid, Long oid);

    /**
     * 得到所有系统消息
     * @return List<SystemMessageVo>
     */
    List<SystemMessageVo> getSystemMessages();

    /**
     * 得到该用户收到的所有邀请函
     * @param uid 源用户id
     * @return List<InvitationVo>
     */
    List<InvitationVo> getInvitations(Long uid);

    /**
     * 得到某群聊消息集合
     * @param uid 源用户id
     * @param gid 群聊id
     * @return List<GroupOrPrivateMessageVo>
     */
    List<GroupOrPrivateMessageVo> getGroupMessages(Long uid, Long gid);

    /**
     * 得到与某好友的私聊消息集合
     * @param uid 源用户id
     * @param fid 好友id
     * @return List<GroupOrPrivateMessageVo>
     */
    List<GroupOrPrivateMessageVo> getPrivateMessages(Long uid, Long fid);

    /**
     * 发送群聊消息
     * @param vo MessageVo
     */
    void sendGroupMsg(MessageVo vo);

    /**
     * 发送私聊消息
     * @param vo MessageVo
     */
    void sendPrivateMsg(MessageVo vo);

    /**
     * 发送群聊邀请
     * @param vo MessageVo
     */
    void sendGroupInvitation(MessageVo vo);

    /**
     * 发送好友邀请
     * @param vo MessageVo
     */
    void sendFriendInvitation(MessageVo vo);

    /**
     * 拒绝邀请
     * @param uid uid
     * @param id invitation id
     */
    void refuseInvitation(Long uid, Long id);

    /**
     * 同意邀请
     * @param uid uid
     * @param id invitation id
     */
    void agreeInvitation(Long uid, Long id);

    /**
     * 得到一个用户的基本信息(包括与源用户的关系信息)
     * @param uid 源用户id
     * @param oid 目标用户id
     * @return Other
     */
    SelfAndOthersAndGroupsVo.Other getOther(Long uid, Long oid);

    /**
     * 得到一个群聊的基本信息(包括群内成员id集合)
     * @param uid 源用户id
     * @param gid 群聊id
     * @return Group
     */
    SelfAndOthersAndGroupsVo.Group getGroup(Long uid, Long gid);

    /**
     * 通知好友
     * @param vo MessageVo
     */
    void noticeFriends(MessageVo vo);

    /**
     * 删除邀请函
     * @param uid uid
     * @param id id
     */
    void deleteInvitation(Long uid, Long id);
}
